package com.cjy.service.impl.dept;

import com.cjy.entity.dept.DeptEntity;

import com.cjy.mapper.dept.DeptMapper;
import com.cjy.service.dept.DeptService;
import com.cjy.common.utils.PreconditionsUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

import com.cjy.common.message.BaseResult;
import com.cjy.vo.dept.DeptVo;

/**
 * 部门表dept的Service实现
 *
 * @author Cheng JiYe
 * @version 1.0 @Date 2021年11月13日 03:23:30
 */
@Service
public class DeptServiceImpl extends ServiceImpl<DeptMapper, DeptEntity> implements DeptService {

  private Logger logger = LoggerFactory.getLogger(getClass());

  @Autowired private DeptMapper deptMapper;

  /**
   * 获取详情
   *
   * @param id 主键id
   * @return
   */
  @Override
  public DeptEntity getByIdDetails(Long id) {
    return this.getById(id);
  }

  /**
   * 分页查询
   *
   * @param req 查询参数
   * @return
   */
  @Override
  public List<DeptEntity> pageList(DeptVo req) {
    BaseResult.startPage(req);
    return deptMapper.queryList(req);
  }

  /**
   * 批量逻辑删除
   *
   * @param ids
   */
  @Transactional(rollbackFor = Exception.class)
  @Override
  public void deleteLogicBatchById(Set<Long> ids) {

    DeptEntity entity = new DeptEntity();
    this.baseMapper.update(entity, new QueryWrapper<DeptEntity>().in("id", ids));
  }

  /**
   * 保存或修改接口
   *
   * @param pageObj 实体对象
   * @return
   */
  @Transactional(rollbackFor = Exception.class)
  @Override
  public DeptEntity saveOrUpdateDo(DeptEntity pageObj) {
    PreconditionsUtils.checkNotNull(pageObj, "保存对象不能为空");

    if (logger.isDebugEnabled()) {
      logger.debug("保存" + pageObj);
    }

    // 验证字段的唯一性
    //
    // PreconditionsUtils.checkArgument(iSexist(pageObj.getId(),"name",pageObj.getName()),"名称["+pageObj.getName()+"]已经存在");

    // 设置更新时间
    Date now = new Date();
    // 新增记录
    if (pageObj.getId() == null) {
      // 设置默认属性
      pageObj.setRemoved(false);
      pageObj.setCreateTime(now);
      // 新增
      this.save(pageObj);
      return pageObj;
    }

    // 更新记录
    DeptEntity dbObj = this.getById(pageObj.getId());
    PreconditionsUtils.checkNotNull(dbObj, "更新的记录不存在");
    // 不能修改的字段
    pageObj.setRemoved(dbObj.getRemoved());
    pageObj.setCreateTime(dbObj.getCreateTime());
    // 更新
    this.updateById(pageObj);

    return pageObj;
  }

  public boolean iSexist(Long id, String rowName, String rowValue) {
    List<String> rowList = new ArrayList<>();
    rowList.add("name");
    rowList.add("username");
    PreconditionsUtils.checkArgument(!rowList.contains(rowName), "此字段不需要判断是否存在");
    List<DeptEntity> list =
        this.baseMapper.selectList(
            new QueryWrapper<DeptEntity>()
                .eq("removed", false)
                .eq(rowName, rowValue)
                .last("limit 1"));
    if (CollUtil.isEmpty(list)) {
      return false;
    }
    DeptEntity dbObj = list.get(0);
    // 编辑时，此字段跟数据库记录一致，不认为重复
    if (dbObj.getId().equals(id)) {
      return false;
    }
    return true;
  }

  /**
   * 通过多个id查询列表
   *
   * @param ids 多个主键id
   * @return
   */
  @Override
  public List<DeptEntity> getListByIds(Set<Long> ids) {
    return (List<DeptEntity>) this.listByIds(ids);
  }
}
